#include <iostream>
#include <bitset>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

#include "bitSet.h"
#include "Bloomfilter.h"

void test_MYbitSet()
{
	my_bitset::bitset<100> b1;
	vector<int> v1 = { 2,12,98,23,76,98,44,90,14,15,67,84 };
	for (auto e : v1)
	{
		b1.set(e);
	}

	vector<int> v2 = { 2,12,98,25,76,91,44,90,15,18,60,89 };

	for (auto e : v2)
	{
		cout << b1.test(e) << ' ';
	}
}

int main()
{
	//bitset<100> b1;
	//vector<int> v1 = { 2,12,98,23,76,98,44,90,14,15,67,84 };
	//for (auto e : v1)
	//{
	//	b1.set(e);
	//}

	//vector<int> v2 = { 2,45,12,98,23,76,98,11,88,44,90,14,15,67,84 };
	//for (auto e : v2)
	//{
	//	cout << b1.test(e) << ' ';
	//}

	//vector<int> v2 = { 209,45,87,160,98,230,76,98,19,88,442,92,19,15,67,88 };

	//for (auto e : v2)
	//{
	//	cout << b1.test(e) << ' ';
	//}

	//for (auto e : v2)
	//{
	//	b1.reset(e);
	//}

	/*cout << b1.test(99) << endl;*/

	//for (int i = 0; i < b1.size(); i++)
	//{
	//	cout << b1[i] << ' ';
	//}

	//std::bitset<5> foo(std::string("01011"));
	// 
	//std::cout << "foo contains:\n";
	//std::cout << std::boolalpha;
	//for (std::size_t i = 0; i < foo.size(); ++i)
	//std::cout << foo.test(i) << '\n';

	//vector<int> v = { 234,3,61,56,1,2,462,362,6,1,523,462,345,4,576,4,668,45743,87,24 };
	//sort(v.begin(), v.end());
	//for (auto e : v)
	//	cout << e << ' ';
	//cout << endl;

	//test_MYbitSet();
	//cout << endl;
	//my_bitset::test_bit_set3();

	// no
	//const int m = 10;
	//int* p = &m;

	//int a = 10;
	//int b = 20;
	//const int* pa = &a;
	//*pa = 10;

	//int const* pb = &b;
	//*pb = 30;

	//int* const p = &a;
	//p = &b;

	TestBloomFilter1();
	TestBloomFilter2();

	return 0;
}
//
////
////void Reverse(string& s, int l, int r)
////{
////    while (l < r)
////    {
////        swap(s[l], s[r]);
////        l++;
////        r--;
////    }
////}
////
////string reverseStr(string s, int k) {
////    size_t len = s.size();
////    int i = 0;
////    while (i < len)
////    {
////        if (len - i < k)
////        {
////            Reverse(s, i, len - 1);
////            break;
////        }
////
////        int n = k, j = i, q = i;
////        while (--n)
////            j++;
////
////        Reverse(s, q, j);
////
////        i += 2 * k;
////    }
////
////    return s;
////}
////
////int main()
////{
////    //string s("abcdefg");
////    string s("a");
////
////    s = reverseStr(s, 2);
////
////    cout << s << endl;
////
////    return 0;
////}
//
////class Solution {
////public:
////	string reverseWords(string s) {
////		size_t l = 0, r = 0;
////		while (l < s.size())
////		{
////			while (r < s.size() && s[r] != ' ') r++;
////			reverse(s.begin() + l, s.begin() + r);
////			r++;
////			l = r;
////		}
////
////		return s;
////	}
////};

//#include <iostream>
//#include <stack>
//#include <string>
//using namespace std;
//
//int longestValidParentheses(string s) {
//    if (s.empty())
//        return 0;
//
//    stack<char> st;
//    int cur = st.size();
//    int num = 0;
//    for (int i = 0; i < s.size(); i++)
//    {
//        bool flag = true;
//        // (s[i] == '(' && st.size() % 2 == 0)
//        int tmp = cur;
//        if (s[i] == '(')
//        {
//            if (st.empty() || st.top() == ')')
//            {
//                st.push(s[i]);
//            }
//            else if (st.top() == '(')
//            {
//                st.pop();
//                st.push(s[i]);
//                flag = false;
//            }
//        }
//        else if (!st.empty() && s[i] == ')' && st.top() == '(')
//        {
//            st.push(s[i]);
//        }
//        cur = st.size();
//
//        if (cur == tmp && flag)
//        {
//            while (!st.empty())
//                st.pop();
//            cur = 0;
//        }
//        num = max(num, cur);
//    }
//
//    return num;
//}
//
//int main()
//{
//    string s("(()");
//    cout << longestValidParentheses(s) << endl;
//
//    return 0;
//}

//class Solution {
//public:
//    string addStrings(string num1, string num2) {
//        string res;
//        int end1 = num1.size() - 1, end2 = num2.size() - 1;
//        int tmp = 0;
//        while (end1 >= 0 || end2 >= 0)
//        {
//            if (end1 >= 0) tmp += num1[end1] - '0', end1--;
//            if (end2 >= 0) tmp += num2[end2] - '0', end2--;
//            res.push_back((tmp % 10) + '0');
//            tmp /= 10;
//        }
//        if (tmp)
//            res.push_back(tmp + '0');
//
//        reverse(res.begin(), res.end());
//
//        return res;
//    }
//
//    string multiply(string num1, string num2) {
//        if (num1 == "0" || num2 == "0")
//            return string("0");
//
//        string s("0");
//        int n = num1.size(), m = num2.size();
//        for (int i = m - 1; i >= 0; i--)
//        {
//            string cur;
//            for (int j = m - 1; j > i; j--)
//            {
//                cur.push_back('0');
//            }
//
//            int y = num2[i] - '0';
//            int add = 0;
//            for (int j = n - 1; j >= 0; j--)
//            {
//                int x = num1[j] - '0';
//                add += x * y;
//                cur.push_back(add % 10 + '0');
//                add /= 10;
//            }
//            while (add)
//            {
//                cur.push_back(add % 10 + '0');
//                add /= 10;
//            }
//            reverse(cur.begin(), cur.end());
//
//            s = addStrings(cur, s);
//        }
//
//        return s;
//    }
//};


//class Board {
//public:
//    bool checkWon(vector<vector<int> > board) {
//        // write code here
//        int row = board.size();
//        int col = board[0].size();
//
//        for (int i = 0; i < row; i++)
//        {
//            int sum = 0;
//            for (int j = 0; j < col; j++)
//            {
//                sum += board[i][j];
//            }
//            if (sum == row) return true;
//        }
//
//        for (int i = 0; i < col; i++)
//        {
//            int sum = 0;
//            for (int j = 0; j < row; j++)
//            {
//                sum += board[j][i];
//            }
//            if (sum == row) return true;
//        }
//
//        int sum = 0;
//        for (int i = 0; i < row; i++)
//        {
//            sum += board[i][i];
//        }
//        if (sum == row) return true;
//
//        sum = 0;
//        for (int i = 0; i < row; i++)
//        {
//            sum += board[i][col - 1 - i];
//        }
//        if (sum == row) return true;
//
//        return false;
//    }
//};

//#include <iostream>
//#include <math.h>
//using namespace std;
//
//bool is_prime(int x)
//{
//    for (int i = 2; i <= sqrt(x); i++)
//        if (x % i == 0)
//            return false;
//    return true;
//}
//
//int main() {
//    int n;
//    cin >> n;
//    for (int i = n / 2; i >= 0; i--)
//    {
//        if (is_prime(i) && is_prime(n - i))
//        {
//            cout << i << endl << n - i << endl;
//            break;
//        }
//    }
//
//    return 0;
//}
